package cn.hit.utils;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;

import cn.hit.constant.HitConstants;

public class HitUtils {

    /**
     * 输出程序运行的跟踪日志
     * 
     * @param exportPath:日志存放的路径
     * @param filename:输出日志文件的文件名
     * @param exportLog:日志文件的内容
     */
    public static void exportLogFile(String exportPath, String filename, String exportLog) {
        exportFile(exportPath+ "\\" + HitConstants.EXPORT_LOG_DRICTORY, filename, exportLog, HitConstants.FILE_TYPE_LOG);
    }

    /**
     * 输出脚本文件
     * 
     * @param exportPath:脚本存放的路径
     * @param filename:输出脚本文件的文件名
     * @param sql:脚本文件的内容
     */
    public static void exportSqlFile(String exportPath, String filename, String sql) {
        exportFile(exportPath + "\\" + HitConstants.EXPORT_SOURCE_DRICTORY, filename, sql, HitConstants.FILE_TYPE_SQL);
    }

    /**
     * 输出文件
     * 
     * @param exportPath:存放的路径
     * @param filename:文件名
     * @param data:内容
     */
    public static void exportFile(String exportPath, String filename, String data, String fileType) {
        OutputStream ops = null;
        try {
            SimpleDateFormat format = new SimpleDateFormat(HitConstants.DATE_TIME_FORMAT_TYPE);
            File logDir = new File(exportPath);
            if (!logDir.exists()) {
                logDir.mkdir();
            }
            File logFile = new File(exportPath + "\\"
                    + format.format(new Date()) + filename + fileType);
            ops = new FileOutputStream(logFile);
            ops.write(data.getBytes(HitConstants.FILE_ENCODING));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                ops.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 递归path目录下的所有以.sql结尾的文件，添加到files里面
     * 
     * @param files:存放以.sql结尾的文件
     * @param path:要递归的根路径
     */
    public static void loopFiles(List<File> files, String path) {
        try {
            File targetDir = new File(path);
            File[] tmpFiles = targetDir.listFiles();
            for (File file : tmpFiles) {
                if (!file.isHidden()) {
                    if (!file.isHidden() && file.isFile()
                            && file.getName().endsWith(HitConstants.FILE_TYPE_SQL)) {
                        files.add(file);
                    } else {
                        loopFiles(files, file.getAbsolutePath());
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 得到一个新ID
     * 
     * @return
     */
    public static String getNewId() {
        // 取得36位随机号
        String newId = "HIT" + UUID.randomUUID().toString();

        // 去掉“-”后，加上 HIT标识字符串
        newId = newId.replace("-", "");
        return newId;

    }

    /**
     * 判断字符串里面是否有汉字
     * 
     * @param str
     * @return 有：true 没有：false
     */
    public static boolean constainChinese(String str) {
        return str.getBytes().length == str.length() ? false : true;
    }
    
    /**
     * 日期格式化为 yyyy-MM-dd
     * @param 例如："'111.1'"转换为date型
     * @return
     */
    public static String dateFomartForStringDouble(String strDb){
        String strModifyTime = strDb;
        strModifyTime = strModifyTime.replace("'", "");
        Date date = DateUtil.getJavaDate(Double
                .valueOf(strModifyTime == null ? "0" : strModifyTime));
        SimpleDateFormat dateFormat = new SimpleDateFormat(HitConstants.DATE_FORMAT_TYPE);
        return dateFormat.format(date);
    }
    
    /**
     * 根据Excel每个单元格的类型不同得到单元格的Value
     * 
     * @param cell
     * @return
     */
    public static String getValueWithCell(Cell cell) {
        Object obj = null;
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            obj = cell.getStringCellValue();
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            obj = cell.getBooleanCellValue();
            break;
        case Cell.CELL_TYPE_FORMULA:
            obj = cell.getCellFormula();
            break;
        case Cell.CELL_TYPE_ERROR:
            obj = cell.getErrorCellValue();
            break;
        case Cell.CELL_TYPE_BLANK:
            obj = "";
            break;
        case Cell.CELL_TYPE_NUMERIC:
            obj = (int)cell.getNumericCellValue();
            break; 
        }
        return obj == null ? null : "'" + obj.toString() + "'";
    }
}
